iT邦幫忙

2022 iThome 鐵人賽

DAY 6
2
Modern Web

Nuxt 3 學習筆記系列 第 6

[Day 06] Nuxt 3 目錄結構與自動載入 (Auto Imports)

  • 分享至 

  • xImage
  •  

前言

隨著整個專案的開發,目錄與元件勢必也會越來越多,如同 Vue 3 的專案可能會有專門放置元件目錄 components 等,在 Vue 3 我們可能不太需要去在意目錄的名稱,但在 Nuxt 3 的專案下,有一些目錄與名稱其實有一些基本的規定與名稱,只要照著 Nuxt 3 約定好的方式進行開發,就能更好利用 Nuxt 3 幫你完成許多貼心的功能。

Nuxt 3 的目錄結構

當我們 Nuxt CLI 建立第一個 Nuxt 3 專案並第一次啟動開發伺服器後,專案目錄結構會長得像這樣:
https://ithelp.ithome.com.tw/upload/images/20220921/20152617AZ8LJ9jTfE.png

如果你是跟著這個系列安裝了 TypeScript、Linter 及 Tailwind CSS 等套件,那麼專案目錄結構會長得像這樣:
https://ithelp.ithome.com.tw/upload/images/20220921/201526177efTtbr39T.png

雖然我們能依照需求建立檔案及目錄,但 Nuxt 3 在目錄的結構與命名其實有一定的規則與模式,以下針對 Nuxt 3 來講述一下目錄的結構與遵循的方式。

Nuxt 3 預設的目錄結構

Nuxt 3 框架希望我們可以專注在開發而不是在配置,所以在預設的情況專案的目錄架構已經有一個不錯的結構可以遵循。

一個完整的 Nuxt 3 專案,它的目錄結構如下:

nuxt-app/
├── .nuxt/
├── .output/
├── assets/
├── components/
├── composables/
├── content/
├── layouts/
├── middleware/
├── node_modules/
├── pages/
├── plugins/
├── public/
└── server/
    ├── api/
    ├── routes/
    └── middleware/
├── .gitignore
├── .nuxtignore
├── app.config.ts
├── app.vue
├── nuxt.config.ts
├── package.json
└── tsconfig.json

.nuxt 目錄

開發環境下由 Nuxt 產生出 Vue 的網站,.nuxt 目錄是自動產生的,你不應該任意的調整裡面檔案

.output 目錄

當你的網站準備部署至正式環境時,每次編譯建構專案時,皆會自動重新產生這個目錄,你不應該任意的調整裡面檔案

assets 目錄

顧名思義,這是靜態資源檔案所放置的位置,目錄內通常包含以下類型的檔案:

  • CSS 樣式檔案 (CSS、SASS 等...)
  • 字型
  • 圖片

這些靜態資源,最終在專案編譯建構時,由 Vite 或 webpack 進行編譯打包。

components 目錄

放置 Vue 元件的地方,Nuxt 會自動載入這個目錄中的任何元件。

composables 目錄

組合式函數放置的目錄,簡單來說可以把常用或通用的功能寫成一個共用的函數或 JS 檔案,放置在這個目錄視為組合式函數,Nuxt 也會自動載入這些組合式函數,讓需要使用的頁面或元件可以直接做使用。

content 目錄

透過使用 Nuxt Content,我們可以在這個目錄下建立 .md.yml.csv.json 檔案,Nuxt Content 會讀取並解析這些文件並進行渲染,用來建立基於文件的 CMS。

layouts 目錄

用於放置通用或可能重複使用到的佈局模板,提供程式碼的可重複使用性。

middleware 目錄

Nuxt 3 提供了路由中間件的概念,用以在導航到下一個頁面之前執行一些程式碼如權限驗證。

node_modules 目錄

通常有使用 Node.js 的套件管理,例如 NPM,對此目錄應該有一些印象,使用 Nuxt 3 及專案所需要的相依套件都會存放在這個目錄。

pages 目錄

這個目錄主要是用來配置我們的頁面,你也可以只使用 app.vue 來完成你的網站,但如果建立了 pages 這個目錄,Nuxt 3 會自動整合 vue-router,並會依據目錄及檔案結構規則來自動產生出對應路由,也是 Nuxt3 產生路由的方式。

plugins 目錄

Nuxt 會自動載入這個目錄檔案,作為插件使用,在檔案名稱可以使用後綴 .server.client,例如, plugin.server.tsplugin.client.ts 來決定只讓伺服器端或客戶端載入這個插件。

public 目錄

這個目錄主要用於伺服器根目錄提供的文件,包含必須固定的檔案名稱如 robots.txt 或不太會變動的 favicon.ico

server 目錄

用於建立任何後端的邏輯如後端 API,這個目錄下還包含了 apiservermiddleware 來區分功能,不具有自動載入,但支援 HMR。

.gitignore 檔案

在使用 Git 版本控制時,可以設置一些不需要或忽略關注變動的檔案及目錄。

.nuxtignore 檔案

可以設置讓 Nuxt 編譯建構時,一些不需要或忽略檔案。

app.config.ts 檔案

提供服務運行時暴露給客戶端使用的設定,因此,請不要在 app.config.ts 檔案中添加任何機密資訊。

app.vue 檔案

Nuxt 3 網站的入口點元件。

nuxt.config.ts 檔案

用於配置 Nuxt 專案的設定檔。

package.json 檔案

這個檔案裡面定義了專案資訊、腳本、相依套件及版本號,通常有使用 Node.js 套件管理工具建置的專案都會包含此檔案。

tsconfig.json 檔案

Nuxt 3 會在 .nuxt 目錄下自動產生一個 tsconfig.json 檔案,其中已經包含了一些解析別名等預設配置;你可以透過專案目錄下的 tsconfig.json 來配置擴展或覆蓋 Nuxt 3 預設的 TypeScript 設定檔。

自訂目錄名稱

前面簡介了Nuxt 3 的預設目錄結構與用途,在目錄名稱上 Nuxt 3 也提供了可以調整目錄名稱的方式,只要在 nuxt.config.ts 修改對應的參數,就可以自訂目錄的名稱。不過呢,也並不是所有的目錄都能修改,目前官方提供dir 參數共有以下四個目錄參數選項供修改:

  • layouts
  • middleware
  • pages
  • public

例如我想將 pages 目錄名稱調整為 views 就可以新增下列 dir 設定添加至 nuxt.config.ts,就可以將 pages 目錄功能及規則調整為 views 目錄來實現。

export default defineNuxtConfig({
  dir: {
    pages: 'views',
  }
}

自動載入 (Auto Imports)

在介紹目錄結構時有提到,某些目錄下的檔案是具有自動載入 (Auto Imports)的功能,意思就是說,當我們在這些特定的目錄 componentscomposableslayoutsplugin 添加檔案時,Nuxt 3 會自動載入這些元件或函數,

Nuxt 3 的自動載入具體有以下三種:

  • Nuxt 常用元件與函數
  • Vue 3 的 API
  • 基於目錄的自動載入

Nuxt 常用元件與函數的自動載入

Nuxt 會自動載入一些元件或組合式函數,用以讓開發時可以在全部頁面或定義元件和插件可以使用。

Nuxt 自動載入的元件就好比 app.vue 程式碼內,一開始在 template 就有的 <NuxtWelcome /> 歡迎頁面元件,其他還包含了 <NuxtPage><NuxtLayout><NuxtLink> 等,詳細可以參考官方文件

例如,下面程式碼中的 useAsyncData$fetch 就是 Nuxt 自動載入的組合式函數,在各個頁面或元件都能做使用。

<script setup>
const { data, refresh, pending } = await useAsyncData('/api/hello', () => $fetch('/api/hello'))
</script>

Vue 3 的 API 的自動載入

例如,Vue 3 中會使用到的 refcomputed 等這類的 helpers 或 lifecycle hooks,在 Nuxt 3 也都將會自動的載入,不需要在 import。

<script setup>
// 不需要在 import ref 或 computed
const count = ref(1)
const double = computed(() => count.value * 2)
</script>

基於目錄的自動載入

如前面所提及的,Nuxt 會自動載入定義在特定目錄的檔案,例如:

  • components: 相對於 Vue 的元件。
  • composables: 相對於 Vue 的組合式函數。

建立一個自動導入的元件

我們建立一個 ./components/IronManWelcome.vue 檔案:

<template>
  <div class="bg-white py-24">
    <div class="flex flex-col items-center">
      <h1 class="text-6xl font-semibold text-sky-400">2022 iThome</h1>
      <p class="mt-4 text-9xl font-bold text-gray-600">鐵人賽</p>
    </div>
  </div>
</template>

app.vue 檔案中,新增 <IronManWelcome /> 元件。

<template>
  <div>
    <IronManWelcome />
  </div>
</template>

現在,瀏覽器可以看見我們添加的元件效果。
https://ithelp.ithome.com.tw/upload/images/20220921/20152617Po6tI3jRgo.png

可以發現,我們不需要添加 import IronManWelcome from './components/IronManWelcome' 就可以直接在 template 直接使用 <IronManWelcome /> 元件,這就是 Nuxt 3 基於目錄的自動載入功能。

關閉自動載入

如果想關閉 Nuxt 的自動載入元件或函數的功能,可以修改專案目錄下的 nuxt.config.ts 檔案,將 imports.autoImport 設定為 false

export default defineNuxtConfig({
  imports: {
    autoImport: false
  }
})

顯式載入 (Explicit Imports)

Explicit (顯式、明確的),當我們需要手動載入,就可以用 #import 這個 Nuxt 釋出的別名,來個別載入那些具有自動載入的元件或函數。

<script setup>
import { ref, computed } from '#imports'

const count = ref(1)
const double = computed(() => count.value * 2)
</script>

小結

Nuxt 3 的專案目錄與結構已經有一個規定可以遵守,Nuxt 3 規劃的目錄及檔案架構,讓我們可以不用再煩惱該如何配置,只需要專注開發,當你熟悉這些目錄檔案規則與自動載入的特性,肯定能更快上手 Nuxt 3。


感謝大家的閱讀,這是我第一次參加 iThome 鐵人賽,請鞭小力一些,也歡迎大家給予建議 :)
如果對這個 Nuxt 3 系列感興趣,可以訂閱接收通知,也歡迎分享給喜歡或正在學習 Nuxt 3 的夥伴。

範例程式碼

參考資料


上一篇
[Day 05] Nuxt 3 如何使用 Tailwind CSS
下一篇
[Day 07] Nuxt 3 頁面 (Pages) 與路由 (Routing)
系列文
Nuxt 3 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
fukahire
iT邦新手 4 級 ‧ 2023-08-15 14:30:00

同脈絡的東西放在一起講變得好清楚

我要留言

立即登入留言